package cn.dlc.com.dongtaiganzhi;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class ZkServer {
	
	private static final String connectString = "192.168.182.88:2181,192.168.182.89:2181,192.168.182.90:2181";
	// 服务挂掉了，会有2000ms的延迟才知道这个服务器挂掉了
	private static final int sessionTimeout = 2000;
	// 统一创建一个父节点
	private static final String parentNode = "/servers";
	
	private ZooKeeper zkClient = null;
	
	/**
	 * 创建连接
	 * @throws Exception
	 */
	public void getConnect() throws Exception{
		zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				// 监听到事件通知之后的业务逻辑
				System.out.println(event.getType() + ": " + event.getPath());
				try {
					// 持续启动监听，监听这个节点
					zkClient.getChildren(parentNode, true);
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	/**
	 * 注册一个服务、也就是新建一个节点
	 * @param hostname 服务的名称
	 * @throws Exception
	 */
	public void registServer(String hostname) throws Exception{
		// 创建一个临时的序列化节点，否则不能被删掉，
		// 序列化节点自动生成序号，名称可以一样的
		String create = zkClient.create(parentNode + "/server", hostname.getBytes(),
				Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
		System.out.println(create);
	}
	
	/**
	 * 创建一个模拟业务
	 */
	public void bussiness(String hostname) throws Exception{
		System.out.println(hostname + "start working...");
		Thread.sleep(Long.MAX_VALUE);
	}
	
	public static void main(String[] args) throws Exception{
		
		ZkServer zkServer = new ZkServer();
		// 初始化连接
		zkServer.getConnect();
		// 注册一个服务,其实就是注册了一个节点，我们通过zookeeper对这个节点的状态进行监听。
		zkServer.registServer(args[0]);
		// 执行业务
		zkServer.bussiness(args[0]);
	}
	
	
	
	
	
	
	

}
